# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/12 15:53 
@Author  : ZhangShenao 
@File    : square_sum_serial.py 
@Desc    : 多进程版本——给定一个list,针对计算list中的每一个元素,计算从0开始到该元素的平方和

结论:针对CPU密集型的任务,适合采用多进程并行的方式,通过增加更多的CPU来提升执行效率
一个典型的场景就是大数据领域的Map-Reduce
否则,无论是采用多线程还是asyncio(多Coroutine)的方式,都不能很好地提升性能
反而可能由于引入了调度机制和上下文切换,导致性能更差
"""
import concurrent
from concurrent import futures
from multiprocessing import freeze_support

from bacis.decorator.perf_log_decorator import perf_log


def calc_square_sum(n: int) -> None:
    """
    计算从0开始到n的平方和
    """
    result = sum([i ** 2 for i in range(0, n + 1)])
    print(f'The square sum of {n} is {result}.')


def calc_all_square_sum(numbers: list[int]) -> None:
    """
    给定一个list,针对计算list中的每一个元素,计算从0开始到该元素的平方和
    :param numbers: 元素list
    """

    # 创建进程池
    with concurrent.futures.ProcessPoolExecutor() as pool:
        pool.map(calc_square_sum, numbers)


@perf_log
def run():
    numbers = [10000000 + x for x in range(20)]
    calc_all_square_sum(numbers)


if __name__ == '__main__':
    freeze_support()
    run()
    # [run] costs 3891.4 ms
